﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using ConciseMarkupLanguage.Utils;

namespace ConciseMarkupLanguage.Tags
{
    public class Html5
    {
        /// <summary>
        /// Defines a hyperlink.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string a(AttrDict attrs, string content)
        {
            return Html.Tag("a", attrs, content);
        }

        /// <summary>
        /// Defines an abbreviation.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string abbr(AttrDict attrs, string content)
        {
            return Html.Tag("abbr", attrs, content);
        }

        /// <summary>
        /// Defines an address element.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string address(AttrDict attrs, string content)
        {
            return Html.Tag("address", attrs, content);
        }

        /// <summary>
        /// Defines an area inside an image map.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string area(AttrDict attrs, string content)
        {
            return Html.Tag("area", attrs, content);
        }

        /// <summary>
        /// Defines an article.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string article(AttrDict attrs, string content)
        {
            return Html.Tag("article", attrs, content);
        }

        /// <summary>
        /// Defines content aside from the page content.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string aside(AttrDict attrs, string content)
        {
            return Html.Tag("aside", attrs, content);
        }

        /// <summary>
        /// Defines sound content.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string audio(AttrDict attrs, string content)
        {
            return Html.Tag("audio", attrs, content);
        }

        /// <summary>
        /// Defines bold text.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string b(AttrDict attrs, string content)
        {
            return Html.Tag("b", attrs, content);
        }

        /// <summary>
        /// Defines a base URL for all the links in a page.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string @base(AttrDict attrs, string content)
        {
            return Html.Tag("base", attrs, content);
        }

        /// <summary>
        /// Defines the direction of text display.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string bdo(AttrDict attrs, string content)
        {
            return Html.Tag("bdo", attrs, content);
        }

        /// <summary>
        /// Defines a long quotation.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string blockquote(AttrDict attrs, string content)
        {
            return Html.Tag("blockquote", attrs, content);
        }

        /// <summary>
        /// Defines the body element.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string body(AttrDict attrs, string content)
        {
            return Html.Tag("body", attrs, content);
        }

        /// <summary>
        /// Inserts a single line break.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string br(AttrDict attrs, string content)
        {
            return Html.Tag("br", attrs, null);
        }

        /// <summary>
        /// Defines a push button.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string button(AttrDict attrs, string content)
        {
            return Html.Tag("button", attrs, content ?? "");
        }

        /// <summary>
        /// Defines graphics.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string canvas(AttrDict attrs, string content)
        {
            return Html.Tag("canvas", attrs, content);
        }

        /// <summary>
        /// Defines a table caption.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string caption(AttrDict attrs, string content)
        {
            return Html.Tag("caption", attrs, content);
        }

        /// <summary>
        /// Defines a citation.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string cite(AttrDict attrs, string content)
        {
            return Html.Tag("cite", attrs, content);
        }

        /// <summary>
        /// Defines computer code text.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string code(AttrDict attrs, string content)
        {
            return Html.Tag("code", attrs, content);
        }

        /// <summary>
        /// Defines attributes for table columns .
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string col(AttrDict attrs, string content)
        {
            return Html.Tag("col", attrs, content);
        }

        /// <summary>
        /// Defines groups of table columns.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string colgroup(AttrDict attrs, string content)
        {
            return Html.Tag("colgroup", attrs, content);
        }

        /// <summary>
        /// Defines a command button.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string command(AttrDict attrs, string content)
        {
            return Html.Tag("command", attrs, content);
        }

        /// <summary>
        /// Defines a dropdown list.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string datalist(AttrDict attrs, string content)
        {
            return Html.Tag("datalist", attrs, content);
        }

        /// <summary>
        /// Defines a definition description.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string dd(AttrDict attrs, string content)
        {
            return Html.Tag("dd", attrs, content);
        }

        /// <summary>
        /// Defines deleted text.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string del(AttrDict attrs, string content)
        {
            return Html.Tag("del", attrs, content);
        }

        /// <summary>
        /// Defines details of an element.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        /// <remarks>The details tag specifies additional details or controls which can be hidden or shown on demand.
        /// 
        /// The content of the details tag should not be visible unless the open attribute is set.</remarks>
        [TemplateTag]
        public static string details(AttrDict attrs, string content)
        {
            return Html.Tag("details", attrs, content);
        }

        /// <summary>
        /// Defines a definition term.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string dfn(AttrDict attrs, string content)
        {
            return Html.Tag("dfn", attrs, content);
        }

        /// <summary>
        /// Defines a section in a document.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string div(AttrDict attrs, string content)
        {
            return Html.Tag("div", attrs, content);
        }

        /// <summary>
        /// Defines a definition list.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string dl(AttrDict attrs, string content)
        {
            return Html.Tag("dl", attrs, content);
        }

        /// <summary>
        /// Defines a definition term.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string dt(AttrDict attrs, string content)
        {
            return Html.Tag("dt", attrs, content);
        }

        /// <summary>
        /// Defines emphasized text.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string em(AttrDict attrs, string content)
        {
            return Html.Tag("em", attrs, content);
        }

        /// <summary>
        /// Defines external interactive content or plugin.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string embed(AttrDict attrs, string content)
        {
            return Html.Tag("embed", attrs, content);
        }

        /// <summary>
        /// Defines a fieldset.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string fieldset(AttrDict attrs, string content)
        {
            return Html.Tag("fieldset", attrs, content);
        }

        /// <summary>
        /// Defines the caption of a figure element.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string figcaption(AttrDict attrs, string content)
        {
            return Html.Tag("figcaption", attrs, content);
        }

        /// <summary>
        /// Defines a group of media content, and their caption.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string figure(AttrDict attrs, string content)
        {
            return Html.Tag("figure", attrs, content);
        }

        /// <summary>
        /// Defines a footer for a section or page.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string footer(AttrDict attrs, string content)
        {
            return Html.Tag("footer", attrs, content);
        }

        /// <summary>
        /// Defines a form.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string form(AttrDict attrs, string content)
        {
            return Html.Tag("form", new AttrDict { { "action", "" } }.Merge(attrs), content);
        }

        /// <summary>
        /// Defines the most important heading.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string h1(AttrDict attrs, string content)
        {
            return Html.Tag("h1", attrs, content);
        }

        /// <summary>
        /// Defines a header.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string h2(AttrDict attrs, string content)
        {
            return Html.Tag("h2", attrs, content);
        }

        /// <summary>
        /// Defines a header.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string h3(AttrDict attrs, string content)
        {
            return Html.Tag("h3", attrs, content);
        }

        /// <summary>
        /// Defines a header.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string h4(AttrDict attrs, string content)
        {
            return Html.Tag("h4", attrs, content);
        }

        /// <summary>
        /// Defines a header.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string h5(AttrDict attrs, string content)
        {
            return Html.Tag("h5", attrs, content);
        }

        /// <summary>
        /// Defines the least important heading.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string h6(AttrDict attrs, string content)
        {
            return Html.Tag("h6", attrs, content);
        }

        /// <summary>
        /// Defines information about the document.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        /// <remarks>The head element is a container for all the head elements. Elements inside head can include scripts, instruct the browser where to find style sheets, provide meta information, and more.</remarks>
        [TemplateTag]
        public static string head(AttrDict attrs, string content)
        {
            return Html.Tag("head", attrs, content);
        }

        /// <summary>
        /// Defines a header for a section or page.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string header(AttrDict attrs, string content)
        {
            return Html.Tag("header", attrs, content);
        }

        /// <summary>
        /// Defines information about a section in a document.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string hgroup(AttrDict attrs, string content)
        {
            return Html.Tag("hgroup", attrs, content);
        }

        /// <summary>
        /// Defines a horizontal rule.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string hr(AttrDict attrs, string content)
        {
            return Html.Tag("hr", attrs, content);
        }

        /// <summary>
        /// Defines an HTML document.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string html(AttrDict attrs, string content)
        {
            return Html.Tag("html", attrs, content);
        }

        /// <summary>
        /// Defines italic text.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string i(AttrDict attrs, string content)
        {
            return Html.Tag("i", attrs, content);
        }

        /// <summary>
        /// Defines an inline sub window (frame).
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string iframe(AttrDict attrs, string content)
        {
            return Html.Tag("iframe", attrs, content);
        }

        /// <summary>
        /// Defines an image.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string img(AttrDict attrs, string content)
        {
            return Html.Tag("img", attrs, content);
        }

        /// <summary>
        /// Defines an input field.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string input(AttrDict attrs, string content)
        {
            // TODO: Make this grab $_REQUEST['name']
            if (content != null)
            {
                if (attrs == null) 
                    attrs = new AttrDict();
                attrs["value"] = content;
            }
            return Html.Tag("input", attrs, null);
        }

        /// <summary>
        /// Defines inserted text.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string ins(AttrDict attrs, string content)
        {
            return Html.Tag("ins", attrs, content);
        }

        /// <summary>
        /// Defines a generated key in a form.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        /// <remarks>When the form is submitted, the private key is stored locally, and the public key is sent to the server.</remarks>
        [TemplateTag]
        public static string keygen(AttrDict attrs, string content)
        {
            return Html.Tag("keygen", attrs, content);
        }

        /// <summary>
        /// Defines keyboard text.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string kbd(AttrDict attrs, string content)
        {
            return Html.Tag("kbd", attrs, content);
        }

        /// <summary>
        /// Defines a label for a form control.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string label(AttrDict attrs, string content)
        {
            return Html.Tag("label", attrs, content);
        }

        /// <summary>
        /// Defines a title in a fieldset.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string legend(AttrDict attrs, string content)
        {
            return Html.Tag("legend", attrs, content);
        }

        /// <summary>
        /// Defines a list item.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string li(AttrDict attrs, string content)
        {
            return Html.Tag("li", attrs, content);
        }

        /// <summary>
        /// Defines a resource reference.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string link(AttrDict attrs, string content)
        {
            return Html.Tag("link", attrs, content);
        }

        /// <summary>
        /// Defines an image map.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string map(AttrDict attrs, string content)
        {
            return Html.Tag("map", attrs, content);
        }

        /// <summary>
        /// Defines marked text.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        /// <remarks>Use the <c>mark</c> tag if you want to highlight parts of your text</remarks>
        [TemplateTag]
        public static string mark(AttrDict attrs, string content)
        {
            return Html.Tag("mark", attrs, content);
        }

        /// <summary>
        /// Defines a menu list.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string menu(AttrDict attrs, string content)
        {
            return Html.Tag("menu", attrs, content);
        }

        /// <summary>
        /// Defines meta information.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string meta(AttrDict attrs, string content)
        {
            return Html.Tag("meta", attrs, content);
        }

        /// <summary>
        /// Defines measurement within a predefined range.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        /// <remarks>Used only for measurements with a known minimum and maximum value. This is also known as a gauge.</remarks>
        [TemplateTag]
        public static string meter(AttrDict attrs, string content)
        {
            return Html.Tag("meter", attrs, content);
        }

        /// <summary>
        /// Defines navigation links.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string nav(AttrDict attrs, string content)
        {
            return Html.Tag("nav", attrs, content);
        }

        /// <summary>
        /// Defines a no-script section.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        /// <remarks>
        /// Used to provide an alternate content for users that have disabled scripts in their browser or have a browser that doesn’t support client-side scripting.
        /// 
        /// The noscript element can contain all the elements that you can find inside the body element of a normal HTML page.
        /// 
        /// The content inside the noscript element will only be displayed if scripts are not supported, or are disabled in the user's browser.</remarks>
        [TemplateTag]
        public static string noscript(AttrDict attrs, string content)
        {
            return Html.Tag("noscript", attrs, content);
        }

        /// <summary>
        /// Defines an embedded object.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string @object(AttrDict attrs, string content)
        {
            return Html.Tag("object", attrs, content);
        }

        /// <summary>
        /// Defines an ordered list.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string ol(AttrDict attrs, string content)
        {
            return Html.Tag("ol", attrs, content);
        }

        /// <summary>
        /// Defines an option group.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string optgroup(AttrDict attrs, string content)
        {
            return Html.Tag("optgroup", attrs, content);
        }

        /// <summary>
        /// Defines an option in a drop-down list.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string option(AttrDict attrs, string content)
        {
            return Html.Tag("option", attrs, content);
        }

        /// <summary>
        /// Defines some types of output.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string output(AttrDict attrs, string content)
        {
            return Html.Tag("output", attrs, content);
        }

        /// <summary>
        /// Defines a paragraph.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string p(AttrDict attrs, string content)
        {
            return Html.Tag("p", attrs, content);
        }

        /// <summary>
        /// Defines a parameter for an object.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string param(AttrDict attrs, string content)
        {
            return Html.Tag("param", attrs, content);
        }

        /// <summary>
        /// Defines preformatted text.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string pre(AttrDict attrs, string content)
        {
            return Html.Tag("pre", attrs, content);
        }

        /// <summary>
        /// Defines progress of a task of any kind.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string progress(AttrDict attrs, string content)
        {
            return Html.Tag("progress", attrs, content);
        }

        /// <summary>
        /// Defines a short quotation.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string q(AttrDict attrs, string content)
        {
            return Html.Tag("q", attrs, content);
        }

        /// <summary>
        /// Used in ruby annotations to define what to show browsers that do not support the ruby element.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string rp(AttrDict attrs, string content)
        {
            return Html.Tag("rp", attrs, content);
        }

        /// <summary>
        /// Defines explanation to ruby annotations.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string rt(AttrDict attrs, string content)
        {
            return Html.Tag("rt", attrs, content);
        }

        /// <summary>
        /// Defines ruby annotations.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string ruby(AttrDict attrs, string content)
        {
            return Html.Tag("ruby", attrs, content);
        }

        /// <summary>
        /// Defines text that is no longer correct.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string s(AttrDict attrs, string content)
        {
            return Html.Tag("s", attrs, content);
        }

        /// <summary>
        /// Defines sample computer code.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string samp(AttrDict attrs, string content)
        {
            return Html.Tag("samp", attrs, content);
        }

        /// <summary>
        /// Defines a script.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string script(AttrDict attrs, string content)
        {
            return Html.Tag("script", attrs, content);
        }

        /// <summary>
        /// Defines a section.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string section(AttrDict attrs, string content)
        {
            return Html.Tag("section", attrs, content);
        }

        /// <summary>
        /// Defines a list of selectable options.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string select(AttrDict attrs, string content)
        {
            return Html.Tag("select", attrs, content);
        }

        /// <summary>
        /// Defines small text.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string small(AttrDict attrs, string content)
        {
            return Html.Tag("small", attrs, content);
        }

        /// <summary>
        /// Defines media resources.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string source(AttrDict attrs, string content)
        {
            return Html.Tag("source", attrs, content);
        }

        /// <summary>
        /// Defines a section in a document.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string span(AttrDict attrs, string content)
        {
            return Html.Tag("span", attrs, content);
        }

        /// <summary>
        /// Defines strong text.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string strong(AttrDict attrs, string content)
        {
            return Html.Tag("strong", attrs, content);
        }

        /// <summary>
        /// Defines a style definition.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string style(AttrDict attrs, string content)
        {
            return Html.Tag("style", attrs, content);
        }

        /// <summary>
        /// Defines subscripted text.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string sub(AttrDict attrs, string content)
        {
            return Html.Tag("sub", attrs, content);
        }

        /// <summary>
        /// Defines the header of a "detail" element.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string summary(AttrDict attrs, string content)
        {
            return Html.Tag("summary", attrs, content);
        }

        /// <summary>
        /// Defines superscripted text.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string sup(AttrDict attrs, string content)
        {
            return Html.Tag("sup", attrs, content);
        }

        /// <summary>
        /// Defines a table.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string table(AttrDict attrs, string content)
        {
            return Html.Tag("table", attrs, content);
        }

        /// <summary>
        /// Defines a table body.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string tbody(AttrDict attrs, string content)
        {
            return Html.Tag("tbody", attrs, content);
        }

        /// <summary>
        /// Defines a table cell.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string td(AttrDict attrs, string content)
        {
            return Html.Tag("td", attrs, content);
        }

        /// <summary>
        /// Defines a text area.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string textarea(AttrDict attrs, string content)
        {
            return Html.Tag("textarea", attrs, content);
        }

        /// <summary>
        /// Defines a table footer.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string tfoot(AttrDict attrs, string content)
        {
            return Html.Tag("tfoot", attrs, content);
        }

        /// <summary>
        /// Defines a table cell header.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string th(AttrDict attrs, string content)
        {
            return Html.Tag("th", attrs, content);
        }

        /// <summary>
        /// Defines a table header.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string thead(AttrDict attrs, string content)
        {
            return Html.Tag("thead", attrs, content);
        }

        /// <summary>
        /// Defines a date/time.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string time(AttrDict attrs, string content)
        {
            return Html.Tag("time", attrs, content);
        }

        /// <summary>
        /// Defines the document title.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string title(AttrDict attrs, string content)
        {
            return Html.Tag("title", attrs, content);
        }

        /// <summary>
        /// Defines a table row.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string tr(AttrDict attrs, string content)
        {
            return Html.Tag("tr", attrs, content);
        }

        /// <summary>
        /// Defines an unordered list.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string ul(AttrDict attrs, string content)
        {
            return Html.Tag("ul", attrs, content);
        }

        /// <summary>
        /// Defines a variable.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string var(AttrDict attrs, string content)
        {
            return Html.Tag("var", attrs, content);
        }

        /// <summary>
        /// Defines a video.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string video(AttrDict attrs, string content)
        {
            return Html.Tag("video", attrs, content);
        }

        /// <summary>
        /// Defines a possible line-break.
        /// </summary>
        /// <param name="attrs"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        [TemplateTag]
        public static string wbr(AttrDict attrs, string content)
        {
            return Html.Tag("wbr", attrs, null);
        }
    }
}